package com.zsinfo.guoss.supplier.activity;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.alipay.sdk.app.PayTask;
import com.example.netcenter.Event.Response;
import com.example.netcenter.RetrofitBuilder;
import com.example.netcenter.Url.ConstantsCode;
import com.example.netcenter.Url.ServerAddress;
import com.example.netcenter.bean.BillingBean;
import com.example.netcenter.bean.ErrorBean;
import com.example.netcenter.bean.ResultsData;
import com.google.gson.Gson;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.zsinfo.guoss.supplier.R;
import com.zsinfo.guoss.supplier.alipay.OrderInfoUtil2_0;
import com.zsinfo.guoss.supplier.alipay.PayResult;
import com.zsinfo.guoss.supplier.base.BaseActivity;
import com.zsinfo.guoss.supplier.utils.SharedPreferencesUtil;

import java.util.Map;

/**
 * Created by lixl on 2018/12/5.
 * <p>
 * desc: 缴纳保证金
 *
 * 逻辑：
 * 1.判断type，1国产起步是2000，2进口起步是5000
 * 2.如果已经缴纳过，继续缴纳，起步是500
 */
public class MarginToPayActivity extends BaseActivity implements View.OnClickListener {

    private EditText et_input_money;
    private ImageView iv_clean;
    private TextView tv_update_money;
    private TextView tv_margin_desc;
    private ImageView iv_wxpay, iv_alipay;
    private Button btn_paymargin;

    private int type = 1; //保证金类型
    private int payMothed = 2;  //充值类型：1微信，2支付宝
    private int totalMoney;
    private int canUseMoney;

    private static final int SDK_PAY_FLAG = 1;
    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((String) msg.obj);
                    /**
                     * 对于支付结果，请商户依赖服务端的异步通知结果。同步通知结果，仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    Log.e("lixl", "alipay------" + resultInfo);
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功，需要依赖服务端的异步通知。
                        showToast("支付成功");
                        startActivity(new Intent(MarginToPayActivity.this, MarginActivity.class));
                        finish();
                    } else {
                        // 判断resultStatus 为非"9000"则代表可能支付失败
                        // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
                        if (TextUtils.equals(resultStatus, "8000")) {
                            showToast("支付结果确认中" + resultStatus);

                        } else {
                            // 其他值就可以判断为支付失败，包括用户主动取消支付，或者系统返回的错误
                            showToast("支付失败" + resultStatus);
                        }
                    }
                    break;
                }
                default:
                    break;
            }
        };
    };


    @Override
    protected int getContentLayoutRes() {
        return R.layout.activity_margin_to_pay;
    }

    @Override
    protected void initView() {
        setTitle("缴纳保证金");
        setBackAndLeftTitle("").setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        requestPermission();

        type = getIntent().getIntExtra("type", 1);
        totalMoney = getIntent().getIntExtra("totalMoney", 0);
        canUseMoney = getIntent().getIntExtra("canUseMoney", 0);

        et_input_money = findViewById(R.id.et_input_money);
        iv_clean = findViewById(R.id.iv_clean);
        tv_update_money = findViewById(R.id.tv_update_money);
        tv_margin_desc = findViewById(R.id.tv_margin_desc);
        iv_wxpay = findViewById(R.id.iv_wxpay);
        iv_alipay = findViewById(R.id.iv_alipay);
        btn_paymargin = findViewById(R.id.btn_paymargin);

        iv_clean.setOnClickListener(this);
        tv_update_money.setOnClickListener(this);
        iv_wxpay.setOnClickListener(this);
        iv_alipay.setOnClickListener(this);
        btn_paymargin.setOnClickListener(this);

        if (type == 1){
            //判断totalMoney是否为0
            if (totalMoney == 0){
                et_input_money.setText("2000");
            } else {
                et_input_money.setText("500");
            }
            tv_margin_desc.setText("保证金可用金额" + canUseMoney + "元，可报价" + canUseMoney/500 + "个商品");
        } else if (type == 2){
            if (totalMoney == 0){
                et_input_money.setText("5000");
            } else {
                et_input_money.setText("500");
            }
            tv_margin_desc.setText("保证金可用金额" + canUseMoney + "元");
        }
        et_input_money.setSelection(et_input_money.getText().toString().trim().length()); //光标显示位置
//        et_input_money.addTextChangedListener(new TextWatcher() {
//            @Override
//            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//                //编辑框的内容发生改变之前的回调方法
//            }
//
//            @Override
//            public void onTextChanged(CharSequence s, int start, int before, int count) {
//                //编辑框的内容正在发生改变时的回调方法 >>用户正在输入
//                //我们可以在这里实时地 通过搜索匹配用户的输入
//                if (s.toString().length() > 0){
//                    iv_clean.setVisibility(View.VISIBLE);
//                } else {
//                    iv_clean.setVisibility(View.GONE);
//                }
//            }
//
//            @Override
//            public void afterTextChanged(Editable s) {
//                //编辑框的内容改变以后,用户没有继续输入时 的回调方法
//            }
//        });
    }

    @Override
    protected void initNetData() {

    }

    @Override
    protected void customDestroy() {

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.iv_clean:
                et_input_money.setText("");
                break;
            case R.id.tv_update_money:
                et_input_money.setText("");
                break;
            case R.id.iv_wxpay:
                payMothed = 1;
                setPayWay(true);
                break;
            case R.id.iv_alipay:
                payMothed = 2;
                setPayWay(false);
                break;
            case R.id.btn_paymargin:
                //根据payMothed，调起支付
                String money = et_input_money.getText().toString().trim();
                if (TextUtils.isEmpty(money)){
                    showToast("请输入金额");
                    return;
                } else if (Integer.parseInt(money) == 0){
                    showToast("缴纳金额最低1元起");
                    return;
                }
                if (payMothed == 1){
                    setWeixinPay(money);
                } else if (payMothed == 2){
                    setAliPay(money);
                }
                break;
        }
    }

    /**
     * 获取权限使用的 RequestCode
     */
    private static final int PERMISSIONS_REQUEST_CODE = 1002;

    /**
     * 检查支付宝 SDK 所需的权限，并在必要的时候动态获取。
     * 在 targetSDK = 23 以上，READ_PHONE_STATE 和 WRITE_EXTERNAL_STORAGE 权限需要应用在运行时获取。
     * 如果接入支付宝 SDK 的应用 targetSdk 在 23 以下，可以省略这个步骤。
     */
    private void requestPermission() {
        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this,
                    new String[]{
                            Manifest.permission.READ_PHONE_STATE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE
                    }, PERMISSIONS_REQUEST_CODE);

        }
    }

    /**
     * 权限获取回调
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSIONS_REQUEST_CODE: {
                // 用户取消了权限弹窗
                if (grantResults.length == 0) {
                    showToast("授权失败，请在设置中授予所需权限");
                    return;
                }

                // 用户拒绝了某些权限
                for (int x : grantResults) {
                    if (x == PackageManager.PERMISSION_DENIED) {
                        showToast("授权失败，请在设置中授予所需权限");
                        return;
                    }
                }

                // 所需的权限均正常获取
                showToast("授权成功");
            }
        }
    }

    /**
     * 根据支付方式，UI
     * @param isWxPay  true微信支付，false支付宝支付
     */
    private void setPayWay(boolean isWxPay) {
        if (isWxPay){
            iv_wxpay.setImageDrawable(this.getResources().getDrawable(R.mipmap.pay_choose_selected));
            iv_alipay.setImageDrawable(this.getResources().getDrawable(R.mipmap.pay_choose_default));
        } else {
            iv_wxpay.setImageDrawable(this.getResources().getDrawable(R.mipmap.pay_choose_default));
            iv_alipay.setImageDrawable(this.getResources().getDrawable(R.mipmap.pay_choose_selected));
        }

    }

    /**
     * 微信缴纳
     * @param money
     */
    private void setWeixinPay(final String money){
        GetNetCenter().GetNetCenter(this,
                RetrofitBuilder.CreateApi().GOTO_PAY_WEIXIN(
                        ConstantsCode.goto_pay_weixinApp,
                        SharedPreferencesUtil.getID(),
                        money, type+""), new Response() {
                    @Override
                    public void OK(Object data) {
                        Log.e("lixl", data.toString());
                        toWX();
                    }

                    @Override
                    public void Fail(Throwable e) {
                        Log.e("lixl", e.getMessage());
                        if (e.getMessage().contains("Code")) {
                            ErrorBean errorBean = new Gson().fromJson(e.getMessage(), ErrorBean.class);
                            showToast(errorBean.getMsg());

                        } else {
                            showToast(e.getMessage());
                        }
                    }

                    @Override
                    public void complete() {

                    }
                });
    }

    /**
     * 支付宝 缴纳
     * @param money
     */
    private void setAliPay(final String money){
        GetNetCenter().GetNetCenter(this,
                RetrofitBuilder.CreateApi().GOTO_PAY_ALI(
                        ConstantsCode.goto_pay_aliApp,
                        SharedPreferencesUtil.getID(),
                        money, type+""), new Response() {
                    @Override
                    public void OK(Object data) {
                        Log.e("lixl", data.toString());
                        toAli(data, money);
                    }

                    @Override
                    public void Fail(Throwable e) {
                        Log.e("lixl", e.getMessage());
                        if (e.getMessage().contains("Code")) {
                            ErrorBean errorBean = new Gson().fromJson(e.getMessage(), ErrorBean.class);
                            showToast(errorBean.getMsg());

                        } else {
                            showToast(e.getMessage());
                        }
                    }

                    @Override
                    public void complete() {

                    }
                });
    }


    /**
     * 调用微信支付
     */
    private void toWX() {
        IWXAPI api= WXAPIFactory.createWXAPI(context, ServerAddress.wx_APPID,false);//填写自己的APPID
        api.registerApp(ServerAddress.wx_APPID);//填写自己的APPID，注册本身APP
        PayReq req = new PayReq();//PayReq就是订单信息对象
        //给req对象赋值
        req.appId = "";  //APPID
        req.partnerId = ""; //商户号
        req.prepayId = "";  //预付款ID
        req.nonceStr = "";  //随机数
        req.timeStamp = ""; //时间戳
        req.packageValue = "Sign=WXPay"; //固定值Sign=WXPay
        req.sign = ""; //签名

        api.sendReq(req);//将订单信息对象发送给微信服务器，即发送支付请求
    }

    /**
     * 调用支付宝支付
     */
    public void toAli(Object data, String money) {
        ResultsData<BillingBean> resultsData = (ResultsData<BillingBean>) data;
        BillingBean orderBean = resultsData.getData();
        /*
         * 这里只是为了方便直接向商户展示支付宝的整个支付流程；所以Demo中加签过程直接放在客户端完成；
         * 真实App里，privateKey等数据严禁放在客户端，加签过程务必要放在服务端完成；
         * 防止商户私密数据泄露，造成不必要的资金损失，及面临各种安全风险；
         *
         * orderInfo 的获取必须来自服务端；
         */
        //秘钥验证的类型 true:RSA2 false:RSA
        boolean rsa = true;
        //构造支付订单参数列表
        Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(
                SharedPreferencesUtil.getALiPayAppId(),
                money,
                "果速送商户版",
                "缴纳"+ orderBean.getCapitalFlows(),
                orderBean.getBillNo(),
                rsa);
        //构造支付订单参数信息
        String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
        //对支付参数信息进行签名
        String sign = OrderInfoUtil2_0.getSign(params, SharedPreferencesUtil.getALiPay_RSA_Private(), rsa);
        //订单信息
        final String orderInfo = orderParam + "&" + sign;
        //异步处理
        final Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                PayTask alipay = new PayTask(MarginToPayActivity.this);
                String result = alipay.pay(orderInfo, true);
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }
}
